﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Timers;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;

namespace TCC_Hotel.Serviços.OtherServices
{
    public class AgendaService
    {

        /// <summary>
        /// Método que lança o timer que verificará a hora de enviar os SMS,
        /// excluir as reservas antigas e cobrar novas diarias
        /// </summary>
        public void LarçarTime()
        {

            //intervalos de 10 em 10 segundos é lançada a thread
            System.Timers.Timer aTimer = new System.Timers.Timer(10000);
            aTimer.Elapsed += new ElapsedEventHandler(AtualizarProcessos);
            aTimer.Enabled = true;

        }

        /// <summary>
        /// Método que será chamado como uma nova thread a cada 10 segundos
        /// </summary>      
        public static void AtualizarProcessos(object source, ElapsedEventArgs e)
        {
           
             ParametroService servico_Parametro = new ParametroService();
            //recupero os paremtros do banco de dados           
             List<Parametros> parametrosBD = servico_Parametro.RecuperarParametros();

            string Horario_SMS = parametrosBD.Where(i => i.Codigo == "Horario_SMS_CheckOut").FirstOrDefault().Valor;
            string Horario_Excluir_Reserva = parametrosBD.Where(i => i.Codigo == "Horario_Exclusao_Reservas_Antigas").FirstOrDefault().Valor;
            string Horario_CheckOut = parametrosBD.Where(i => i.Codigo == "Horario_CheckOut").FirstOrDefault().Valor;
            string Horario_GerarNovaDiariaCheckOut = parametrosBD.Where(i => i.Codigo == "Horario_Novas_Diarias_CheckOut").FirstOrDefault().Valor;
           
            int QntDias_Exclusao_Reservas = Convert.ToInt32(parametrosBD.Where(i => i.Codigo == "Quantidade_Dias_Exclusao_Reservas").FirstOrDefault().Valor);

            //Chama o método para tratar as reservas antigas
            VerificaExclusaoReservas(Horario_Excluir_Reserva, QntDias_Exclusao_Reservas);

            //Chama o método para tratar dos SMS de alerta para se realizar os check-Out
            VerificaEnvioSMS(Horario_SMS, Horario_CheckOut);

            //Chama o método para tratar das iarias geradas a mais para os hospedes que nao fizeram o checkout
            VerificaGerarOutraDiaria(Horario_GerarNovaDiariaCheckOut);
        }

        /// <summary>
        /// Verifica se esta na hora de excluir as reservas antigas e, se tiver, exclui elas
        /// </summary>
        /// <param name="HorarioExclusao">Horário da exclusao</param>
        public static void VerificaExclusaoReservas(string HorarioExclusao, int QuantidadeDiasExlusao)
        {
            //Converter para timeSpan            
            TimeSpan ts = Convert.ToDateTime(HorarioExclusao).TimeOfDay;

            DateTime data = DateTime.Today.Date.Add(ts);

            //Verifica se esta na hora com 10 segundos de tolerancia
            if (data >= DateTime.Now.AddMilliseconds(10000 * -1) &&
                data <= DateTime.Now)
            {
                ReservaService servico_Reserva = new ReservaService();
                //chama o serviço que exclui as reservas antigas
                servico_Reserva.ExcluirReservasAntigas(QuantidadeDiasExlusao);          

            }

        }

        /// <summary>
        /// Verifica se esta na hora de enviar os SMS para os hóspedes que irão fazer o check-in hoje
        /// </summary>
        /// <param name="HorarioExclusao">Horário do envio</param>
        public static void VerificaEnvioSMS(string HorarioEnvio, string HorarioCheckOut)
        {
            //Converter para timeSpan            
            TimeSpan ts = Convert.ToDateTime(HorarioEnvio).TimeOfDay;

            DateTime data = DateTime.Today.Date.Add(ts);

            //Verifica se esta na hora com 10 segundos de tolerancia
            if (data >= DateTime.Now.AddMilliseconds(10000 * -1) &&
                data <= DateTime.Now)
            {
                FluxoHospedesService servico_Fluxo = new FluxoHospedesService();
                ExternalService servico_Externo = new ExternalService();
                List<Fluxo_Hospedes> fluxoHospedesCheckOutHoje = servico_Fluxo.RecuperarFluxoHospedesAgora().Where(i => i.Data_Saida.Date == DateTime.Today.Date).ToList();

                foreach (var fluxo in fluxoHospedesCheckOutHoje)
                {
                    //verifica se o hóspede permite receber SMS
                    if (fluxo.SMSCheckOut)
                    {
                        string SMS = "SIGHO Informa: Faça seu Check-Out hoje até às " + HorarioCheckOut + " ou então " +
                            "será gerada uma nova diaria! Obrigado!";
                        servico_Externo.EnviarSMS(SMS, fluxo.Celular);
                    }

                }
            }
        }

        /// <summary>
        /// Verifica se esta na hora de gerar nova diaria para os hospedes que não fizeram o check-out
        /// </summary>
        /// <param name="HorarioExclusao">Horário da exclusao</param>
        public static void VerificaGerarOutraDiaria(string HorarioNovaDiaria)
        {
            //Converter para timeSpan            
            TimeSpan ts = Convert.ToDateTime(HorarioNovaDiaria).TimeOfDay;

            DateTime data = DateTime.Today.Date.Add(ts);

            //Verifica se esta na hora com 10 segundos de tolerancia
            if (data >= DateTime.Now.AddMilliseconds(10000 * -1) &&
                data <= DateTime.Now)
            {
                FluxoHospedesService servico_Fluxo = new FluxoHospedesService();
                List<Fluxo_Hospedes> fluxoHospedesCheckOutHoje = servico_Fluxo.RecuperarFluxoHospedesAgora().Where(i => i.Data_Saida.Date <= DateTime.Today.Date).ToList();

                foreach (var fluxo in fluxoHospedesCheckOutHoje)
                {
                   servico_Fluxo.GerarNovaDiaria(fluxo.ID, DateTime.Today.AddDays(1));

                }
            }

        }



    }
}